package com.wwdeng.print.app.meituan

import android.graphics.BitmapFactory
import com.wwdeng.print.app.PrintApp
import com.wwdeng.print.app.R
import com.wwdeng.print.app.printer.EscPosUtils
import org.json.JSONObject
import java.math.BigDecimal

/**
 * PrintTestDemo
 * @Author：wwdeng
 * @CreateTime：2025/4/8 23:19
 * <pre>
 *  美团打印帮助类
 * </pre>
 */
object MeiTuanPrintHelper {
    /**
     * 预结单、结账单、发票
     * 头部：LOGO，描述、店铺名称
     */
    private fun MutableList<ByteArray>.getPrintStoreTop(obj: JSONObject): MutableList<ByteArray>{
        apply {
            // 初始化打印机
            add(EscPosUtils.initPrinter())
            // 设置居中对齐
            add(EscPosUtils.setAlign(1))

            //logo
            var logoResId = obj.optInt("logoResId",0)
            if (logoResId == 0){
                logoResId = R.mipmap.test_logo
            }
            val logoBitmap = BitmapFactory.decodeResource(PrintApp.app.resources, logoResId);
            add(MeiTuanEscPosImageUtils.getImagePrintCommand(logoBitmap))

            //设置行间距
            add(EscPosUtils.setLineSpacing(40))

            //店铺描述
            add(EscPosUtils.printLine("★${obj.optString("storeDesc")}★"))

            //店名
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printLine(obj.optString("storeTitle")))
            add(EscPosUtils.setBold(false))
            add(EscPosUtils.setFontSize(0))
        }
        return this
    }

    /**
     * 商品列表
     */
    private fun MutableList<ByteArray>.getPrintProductList(obj: JSONObject): MutableList<ByteArray>{
        apply {
            //设置行间距
            add(EscPosUtils.setLineSpacing(40))
            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            // 设置字体大小
            add(EscPosUtils.setFontSize(0))

            val menuList = obj.optJSONArray("menuList")
            var totalPrice = 0
            var totalNum = 0
            if (menuList != null) {
                add(MeiTuanEscPosMenuUtils.printFourColumns("商品","数量","单价","合计"))
                for (i in 0..< menuList.length()){
                    val item = menuList.optJSONObject(i)
                    val pName = item.optString("title")
                    //单价x数量=总价
                    val price = BigDecimal(item.optString("price")).stripTrailingZeros().toPlainString()
                    val num = BigDecimal(item.optString("num")).stripTrailingZeros().toPlainString().toInt()
                    val total = BigDecimal(price).multiply(BigDecimal("$num")).stripTrailingZeros().toPlainString().toInt()
                    totalPrice += total
                    totalNum += num

                    //商品       单价x数量=总价
//                    add(EscPosUtils.printTwoColumns(item.optString("title"),"￥${EscPosUtils.formatPrintPrice(price)}${"x"}$num=￥${EscPosUtils.formatPrintPrice(total.toString())}",48))
                    //商品       数量   单价  合计
                    add(MeiTuanEscPosMenuUtils.printFourColumns(pName,"$num","￥${EscPosUtils.formatPrintPrice(price)}","￥${EscPosUtils.formatPrintPrice(total.toString())}"))
                }
            }
        }
        return this
    }

    /**
     * 预结单
     */
    fun MutableList<ByteArray>.formatPrintPreSettlementOrder(order: JSONObject): MutableList<ByteArray>{
        apply {
            //logo、描述、店铺名称
            getPrintStoreTop(order)

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            // 设置字体大小
            add(EscPosUtils.setFontSize(0))
            //创建时间
            add(EscPosUtils.printLine(order.optString("createTime")))
            //设置行间距
            add(EscPosUtils.setLineSpacing(40))
            //座位号
            add(EscPosUtils.printLine("席番号：${order.optString("tableCode")}(${order.optString("count")}名)"))

            //分割线
            add(EscPosUtils.printDivider('-', 48))

            //商品列表
            getPrintProductList(order)
            val totalNum = order.optString("totalNum")
            val totalPrice = order.optString("totalPrice")

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //商品总数
            add(EscPosUtils.printTwoColumns("商品点数","${totalNum}点",48))
            //商品合计
            add(EscPosUtils.printTwoColumns("商品合計(税込)","￥${EscPosUtils.formatPrintPrice(totalPrice)}",48))

            // 设置右对齐
            add(EscPosUtils.setAlign(2))
            //税率
            add(EscPosUtils.printLine("*は軽減税率8%適用商品"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //税后小计
            add(EscPosUtils.printTwoColumns("小計(税抜)","￥${EscPosUtils.formatPrintPrice("${totalPrice.toInt() - (totalPrice.toInt() * 0.08)}")}",48))
            //消费税
            add(EscPosUtils.printTwoColumns("消費税","￥${EscPosUtils.formatPrintPrice("${totalPrice.toInt() * 0.08}")}",48))

            //合计
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printTwoColumns("合計","￥${EscPosUtils.formatPrintPrice(totalPrice)}",24))
            add(EscPosUtils.setFontSize(0))
            add(EscPosUtils.setBold(false))

            // 设置右对齐
            add(EscPosUtils.setAlign(2))
            add(EscPosUtils.printLine("(8%対象  ￥${EscPosUtils.formatPrintPrice(totalPrice)})"))
            add(EscPosUtils.printLine("(10%对象  ￥${EscPosUtils.formatPrintPrice("0")})"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //支付方式
            add(EscPosUtils.printTwoColumns("PayPay","￥${EscPosUtils.formatPrintPrice(totalPrice)}",48))
            add(EscPosUtils.printTwoColumns("お釣り","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))

            // 设置左对齐
            add(EscPosUtils.setAlign(0))
            //登录番号
            add(EscPosUtils.printLine("登録番号：${order.optString("loginCode")}"))
            //姓名
            add(EscPosUtils.printLine("事業者名：${order.optString("loginName")}"))
            //地址
            add(EscPosUtils.printLine(order.optString("address")))
            //电话
            add(EscPosUtils.printLine(order.optString("mobile")))
            //多换一行
            add(EscPosUtils.lineFeed())
            //多换一行
            add(EscPosUtils.lineFeed())
        }
        return this
    }

    /**
     * 结账单
     */
    fun MutableList<ByteArray>.formatPrintSettlementOrder(order: JSONObject): MutableList<ByteArray>{
        apply {
            //logo、描述、店铺名称
            getPrintStoreTop(order)

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            // 设置字体大小
            add(EscPosUtils.setFontSize(0))
            //分割线
            add(EscPosUtils.setLineSpacing(40))
            add(EscPosUtils.printDivider('*', 48))
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.printLine("会計前伝票"))
            add(EscPosUtils.setFontSize(0))
            //分割线
            add(EscPosUtils.printDivider('*', 48))

            //创建时间
            add(EscPosUtils.printLine(order.optString("createTime")))

            //座位号
            add(EscPosUtils.printLine("席番号：${order.optString("tableCode")}(${order.optString("count")}名)"))

            //分割线
            add(EscPosUtils.printDivider('-', 48))

            //商品列表
            getPrintProductList(order)
            val totalNum = order.optString("totalNum")
            val totalPrice = order.optString("totalPrice")

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            // 设置字体大小
            add(EscPosUtils.setFontSize(0))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //商品总数
            add(EscPosUtils.printTwoColumns("商品点数","${totalNum}点",48))
            //商品合计
            add(EscPosUtils.printTwoColumns("商品合計(税込)","￥${EscPosUtils.formatPrintPrice(totalPrice)}",48))

            //税率
            add(EscPosUtils.printLine("*は軽減税率8%適用商品"))

            //税后小计
            add(EscPosUtils.printTwoColumns("小計(税抜)","￥${EscPosUtils.formatPrintPrice("${totalPrice.toInt() - (totalPrice.toInt() * 0.08)}")}",48))
            //值引金額
            add(EscPosUtils.printTwoColumns("值引金額","-0",48))
            //消费税
            add(EscPosUtils.printTwoColumns("消費税","￥${EscPosUtils.formatPrintPrice("${totalPrice.toInt() * 0.08}")}",48))

            //合计
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printTwoColumns("合計","￥${EscPosUtils.formatPrintPrice(totalPrice)}",24))
            add(EscPosUtils.setFontSize(0))
            add(EscPosUtils.setBold(false))

            // 设置右对齐
            add(EscPosUtils.setAlign(2))
            add(EscPosUtils.printLine("(8%対象  ￥${EscPosUtils.formatPrintPrice(totalPrice)})"))
            add(EscPosUtils.printLine("(10%对象  ￥${EscPosUtils.formatPrintPrice("0")})"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //分割线
            add(EscPosUtils.printDivider('-', 48))

            // 设置左对齐
            add(EscPosUtils.setAlign(0))
            //登录番号
            add(EscPosUtils.printLine("登録番号：${order.optString("loginCode")}"))
            //地址
            add(EscPosUtils.printLine(order.optString("address")))
            //电话
            add(EscPosUtils.printLine(order.optString("mobile")))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //二维码
            add(EscPosUtils.printQRCode(order.optString("qrCodeUrl"), 6, 48))
            //多换一行
            add(EscPosUtils.lineFeed())
            //多换一行
            add(EscPosUtils.lineFeed())
        }
        return this
    }

    /**
     * 发票
     */
    fun MutableList<ByteArray>.formatPrintInvoice(order: JSONObject): MutableList<ByteArray>{
        apply {
            //logo、描述、店铺名称
            getPrintStoreTop(order)

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))

            //領收書
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setLineSpacing(40))
            add(EscPosUtils.printLine("領 收 書"))
            add(EscPosUtils.setFontSize(0))
            //创建时间
            add(EscPosUtils.printLine(order.optString("createTime")))
            // 设置居右对齐
            add(EscPosUtils.setAlign(2))
            add(EscPosUtils.printLine("様"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            //分割线
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printDivider('-', 48))
            add(EscPosUtils.setBold(false))
            // 设置居右对齐
            add(EscPosUtils.setAlign(2))
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.printLine("￥${EscPosUtils.formatPrintPrice(order.optString("totalPrice"))}"))
            add(EscPosUtils.setFontSize(0))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))

            //分割线
            add(EscPosUtils.printDivider('-', 48))

            // 设置居右对齐
            add(EscPosUtils.setAlign(2))
            add(EscPosUtils.printLine("(内消費税：￥${EscPosUtils.formatPrintPrice(order.optString("tax"))})"))
            add(EscPosUtils.printLine("8%対象：￥${EscPosUtils.formatPrintPrice("0")})"))
            add(EscPosUtils.printLine("10%対象：￥${EscPosUtils.formatPrintPrice(order.optString("totalPrice"))}"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            add(EscPosUtils.printTwoColumns("开票人",order.optString("userName"),48))

            // 设置靠左对齐
            add(EscPosUtils.setAlign(0))
            add(EscPosUtils.printLine("但し 飲食代として"))
            add(EscPosUtils.printLine("上記正に領収いたしました。"))

            // 设置居中对齐
            add(EscPosUtils.setAlign(1))
            add(EscPosUtils.printDivider('-', 48))
            add(EscPosUtils.printLine("*領收書明細*"))

            //商品列表
            getPrintProductList(order)
            val totalPrice = order.optString("totalPrice")

            //合计
            add(EscPosUtils.printTwoColumns("合計","￥${EscPosUtils.formatPrintPrice(totalPrice)}",48))

            // 设置左对齐
            add(EscPosUtils.setAlign(0))
            //登录番号
            add(EscPosUtils.printLine("登録番号：${order.optString("loginCode")}"))
            //姓名
            add(EscPosUtils.printLine("事業者名：${order.optString("loginName")}"))
            //地址
            add(EscPosUtils.printLine(order.optString("address")))
            //电话
            add(EscPosUtils.printLine(order.optString("mobile")))
            //多换一行
            add(EscPosUtils.lineFeed())
            //多换一行
            add(EscPosUtils.lineFeed())
        }
        return this
    }

    /**
     * 交班单
     */
    fun MutableList<ByteArray>.formatPrintHandOver(order: JSONObject): MutableList<ByteArray>{
        apply {
            // 初始化打印机
            add(EscPosUtils.initPrinter())
            // 设置居中对齐
            add(EscPosUtils.setAlign(1))

            //logo
            var logoResId = order.optInt("logoResId",0)
            if (logoResId == 0){
                logoResId = R.mipmap.test_logo
            }
            val logoBitmap = BitmapFactory.decodeResource(PrintApp.app.resources, logoResId);
            add(MeiTuanEscPosImageUtils.getImagePrintCommand(logoBitmap))

            //设置行间距
            add(EscPosUtils.setLineSpacing(40))

            //売上精算
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printLine("売上精算"))
            add(EscPosUtils.setBold(false))
            add(EscPosUtils.setFontSize(0))

            //创建时间
            add(EscPosUtils.printTwoColumns(EscPosUtils.formatDate(System.currentTimeMillis(),"yyyy-MM-dd hh:mm:ss"),"Admin",48))

            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //給点数
            add(EscPosUtils.printTwoColumns("給点数","675点",48))
            //商品合計（税抜）
            add(EscPosUtils.printTwoColumns("商品合計（税抜）","￥${EscPosUtils.formatPrintPrice("230111")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //売上高（税込）
            add(EscPosUtils.printTwoColumns("売上高（税込）","￥${EscPosUtils.formatPrintPrice("253112")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //商品合計
            add(EscPosUtils.printTwoColumns("商品合計","53件    ￥${EscPosUtils.formatPrintPrice("253112")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //値引金額
            add(EscPosUtils.printTwoColumns("値引金額","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //現金値引
            add(EscPosUtils.printTwoColumns("現金値引","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //クーポン値引
            add(EscPosUtils.printTwoColumns("クーポン値引","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //端数值引
            add(EscPosUtils.printTwoColumns("端数值引","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //合計
            add(EscPosUtils.printTwoColumns("合計","￥${EscPosUtils.formatPrintPrice("253122")}",48))
            //（10%対象）
            add(EscPosUtils.printLine("（10%対象）￥${EscPosUtils.formatPrintPrice("253122")}"))
            //内消費税
            add(EscPosUtils.printTwoColumns("内消費税","￥${EscPosUtils.formatPrintPrice("23011")}",48))
            //合計（税抜）
            add(EscPosUtils.printTwoColumns("合計（税抜）","￥${EscPosUtils.formatPrintPrice("230111")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //今日合計
            add(EscPosUtils.printLine("今日合計"))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //取引数
            add(EscPosUtils.printTwoColumns("取引数","51组",48))
            //客数
            add(EscPosUtils.printTwoColumns("客数","115人",48))
            //客単価
            add(EscPosUtils.printTwoColumns("客単価","￥${EscPosUtils.formatPrintPrice("2201")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //支払種別（税込）
            add(EscPosUtils.printLine("支払種別（税込）"))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //現金
            add(EscPosUtils.printTwoColumns("現金","￥${EscPosUtils.formatPrintPrice("117362")}",48))
            //QRコード
            add(EscPosUtils.printTwoColumns("QRコード","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //三井POS
            add(EscPosUtils.printTwoColumns("三井POS","￥${EscPosUtils.formatPrintPrice("32078")}",48))
            //ポイント
            add(EscPosUtils.printTwoColumns("ポイント","￥${EscPosUtils.formatPrintPrice("1000")}",48))
            //レストランボード
            add(EscPosUtils.printTwoColumns("レストランボード","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //会員カード
            add(EscPosUtils.printTwoColumns("会員カード","￥${EscPosUtils.formatPrintPrice("0")}",48))
            //コード決済
            add(EscPosUtils.printTwoColumns("コード決済","￥${EscPosUtils.formatPrintPrice("102682")}",48))
            //分割线
            add(EscPosUtils.printDivider('-', 48))

            //合計
            add(EscPosUtils.setFontSize(17))
            add(EscPosUtils.setBold(true))
            add(EscPosUtils.printTwoColumns("合計","￥${EscPosUtils.formatPrintPrice("253122")}",24))
            add(EscPosUtils.setBold(false))
            add(EscPosUtils.setFontSize(0))

            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //今月累計
            add(EscPosUtils.printLine("今月累計"))
            //分割线
            add(EscPosUtils.printDivider('-', 48))
            //売上
            add(EscPosUtils.printTwoColumns("売上","￥${EscPosUtils.formatPrintPrice("10121788")}",48))
            //組数
            add(EscPosUtils.printTwoColumns("組数","1445组",48))
            //人数
            add(EscPosUtils.printTwoColumns("人数","4660人",48))
            //客単価
            add(EscPosUtils.printTwoColumns("客単価","￥${EscPosUtils.formatPrintPrice("2172")}",48))
            //印刷時間：2025-04-25 07:38:12
            add(EscPosUtils.printLine("印刷時間：${EscPosUtils.formatDate(System.currentTimeMillis(),"yyyy-MM-dd hh:mm:ss")}"))

            //多换一行
            add(EscPosUtils.lineFeed())
            //多换一行
            add(EscPosUtils.lineFeed())
        }
        return this
    }
}